Jeg viser en liste over kontakter fra Web Service og viser den i kontakter 'seksjonert' tableView som vist på skjermbildet. Problemet er at jeg får samme merkeverdier for avmerkingsboksene i første rad for seksjon A så vel som seksjon S. Jeg har sortert en matrise og vist i den indekserte tabellvisningen. Hvordan få forskjellige merkeverdier avhengig av indexPath.row uavhengig av antall seksjoner som vises. Her er hva jeg prøvde I celleForRowAtIndexPath: UIButton * sjekkboks; hvis (UI_USER_INTERFACE_IDIOM () == UIUserInterfaceIdiomPhone) { checkBox = [[UIButton alloc] initWithFrame: CGRectMake (7, 8, 30, 30)]; } ellers { checkBox = [[UIButton alloc] initWithFrame: CGRectMake (15, 13, 30, 30)]; } // int cnt = 0; // for (int i = indexPath.section - 1; i> 0; i--) // { // cnt + = [[objectsForCharacters objectForKey: [arrayOfCharacters objectAtIndex: i]] count]; // arrayOfCharachters har røyke 'A' til 'Z' //} //checkBox.tag = cnt + indexPath.row; [checkBox setImage: [UIImage imageNamed: @ "checkBox.png"] forState: UIControlStateNormal]; [checkBox addTarget: self action: @selector (checkBoxClicked :) forControlEvents: UIControlEventTouchUpInside]; [checkBox setTag: indexPath.row]; [cell.contentView addSubview: checkBox]; returcelle; } - (ugyldig) checkBoxClicked: (id) avsender { CGPoint buttonPosition = [avsender convertPoint: CGPointZero toView: self.tableViewContact]; NSIndexPath * indexPath = [self.tableViewContact indexPathForRowAtPoint: buttonPosition]; UIButton * tappedButton = (UIButton *) avsender; NSLog (@ "Tag nummer =% d", [avsender tag]); if ([tappedButton.currentImage isEqual: [UIImage imageNamed: @ "checkBox.png"]]) { [sender setImage: [UIImage imageNamed: @ "checkBoxMarked.png"] forState: UIControlStateNormal]; hvis (indexPath! = Nil) { NSString * finalIntId = [mutableArrayOfIds objectAtIndex: indexPath.row]; // lagre avkrysnings-ID-er i mutableArrayOfIds NSLog (@ "Merket avkrysset knapp id =% @", finalIntId); [arrayOfIds addObject: finalIntId]; } // NSString * finalIntId = [mutableArrayOfIds objectAtIndex: tappedButton.tag]; // NSString * finalIntId = [mutableArrayOfIds objectAtIndex: indexPath.row]; } ellers { [sender setImage: [UIImage imageNamed: @ "checkBox.png"] forState: UIControlStateNormal]; NSLog (@ "UnChecked"); // [arrayOfIds removeObjectAtIndex: tappedButton.tag]; } } - (NSString *) tableView: (UITableView *) tableView titleForHeaderInSection: (NSInteger) seksjon { hvis ([arrayOfCharacters count] == 0) { komme tilbake @""; } returnere [NSString stringWithFormat: @ "% @", [arrayOfCharacters objectAtIndex: seksjon]]; } - (NSArray *) seksjonIndexTitlesForTableView: (UITableView *) tableView { NSArray * toBeReturned = [NSArray arrayWithArray: [@ "A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z | # " componentsSeparatedByString: @ "|"]]; gå tilbake til BeReturned; } - (NSInteger) tableView: (UITableView *) tableView sectionForSectionIndexTitle: (NSString *) title atIndex: (NSInteger) index { NSInteger count = 0; for (NSString * tegn i arrayOfCharacters) { hvis ([tegn erEqualToString: tittel]) { returantall; } telle ++; } retur 0; } - (NSInteger) numberOfSectionsInTableView: (UITableView *) tableView { return [arrayOfCharacters count]; // retur 1; } - (NSInteger) tableView: (UITableView *) tableView numberOfRowsInSection: (NSInteger) seksjon { // return [mutableArray count]; return [[objectsForCharacters objectForKey: [arrayOfCharacters objectAtIndex: section]] count]; }
2020-12-07 22:55:42
du setter den samme merkeverdien for alle seksjoner som har samme rad. IndexPath har to egenskaper, {seksjon, rad}. La oss si at seksjon A har to rader, for rad1 -> indexPath.section = 0, indexPath.row = 0; for rad2-> indexPath.section = 0, indexPath.row = 1; La oss si at seksjon S har to rader, for rad1 -> indexPath.section = 1, indexPath.row = 0; for rad2-> indexPath.section = 1, indexPath.row = 1; Så, for rad 1 i seksjon A og rad 1 i seksjon S, setter du den samme merkeverdien som er 0. Det er problemet ditt. Prøv å angi merkeverdi som nedenfor. button.tag = indexPath.section * 1000 + indexPath.row; når du henter seksjonen og raden, NSInteger seksjon = (button.tag) / 1000; NSInteger row = (button.tag)% 1000; | Prøv dette... - (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath { statisk NSString * CellIdentifier = @ "Cell"; UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier: CellIdentifier]; hvis (celle == null) { cell = [[UITableViewCell alloc] initWithStyle: UITableViewCellStyleDefault reuseIdentifier: CellIdentifier]; } UIButton * checkBox = [[UIButton alloc] initWithFrame: CGRectMake (280, 10, 50, 44)]; checkBox.backgroundColor = [UIColor orangeColor]; [checkBox addTarget: self action: @selector (checkBoxClicked: event:) forControlEvents: UIControlEventTouchUpInside]; [checkBox setTag: indexPath.row]; [cell.contentView addSubview: checkBox]; returcelle; } - (ugyldig) checkBoxClicked: (id) avsenderhendelse: (id) hendelse { NSSet * berører = [event allTouches]; UITouch * touch = [berører anyObject]; CGPoint currentTouchPosition = [berør locationInView: self.tv]; // her er tv TableView Object NSIndexPath * indexPath = [self.tv indexPathForRowAtPoint: currentTouchPosition]; NSLog (@ "verdi av indePath.section% d, indexPath.row% d", indexPath.section, indexPath.row); } | Dette skjer fordi du tilordner tag til knapper INDEPENDENT av seksjoner. Begge første rader av seksjoner A og S har rad = 0. så merket tilordnet til deres respektive knapp er 0. Du bør tilordne dem. Jeg vil foreslå å tilordne tilgjengelighetshint med kommaseparert skjema som inneholder seksjon, rad. Og i din metode - (ugyldig) checkBoxClicked: (id) avsender { // plukk streng fra kommaadskilt form. Første er din seksjon, 2. er rad. } det andre alternativet er Gjør hva du gjør og implementer knappemetoden din slik. CGPoint buttonPosition = [avsender convertPoint: CGPointZero toView: self.tableView]; NSIndexPath * indexPath = [self.tableView indexPathForRowAtPoint: buttonPosition]; hvis (indexPath! = null) { ... indexpath.section er din seksjon, index path.row er din rad. } Det er også det tredje alternativet. i cellforRowAtIndexpath tildel knappen en tittel - (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath [btn setTitle: <# Your Row #> forState: UIControlStateDisabled]; [btn setTag <# Your Section #>]; så når du mottar i knappemetoden din, kan du ha både seksjon (tag) og rad (tittel for deaktivert tilstand). - (ugyldig) checkBoxClicked: (id) avsender {[button titleForState: UIControlStateDisabled]; // din rad button.tag // din seksjon} | Prøv dette! Hver seksjon vet du kanskje antall teller til høyre, og legg deretter til antall individuelle rader. [[fieldTitlesList objectAtIndex: indexPath.section - 1] count] + indexPath.row Hvor fieldTitlesList er matrisen til seksjonene dine. | Jeg la til følgende kode som løste problemet mitt NSInteger rowNumber = 0; for (NSInteger i = 0; i